From: Konrad Rzeszutek Wilk Date: Thu, 28 Apr 2016 14:11:46 +0000 (-0400) Subject: xsplice/xen_replace_world: Test-case for XSPLICE_ACTION_REPLACE X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~1186 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=48a312d1ade7f7df0ee10ae192cb7a09247c14bc;p=xen.git xsplice/xen_replace_world: Test-case for XSPLICE_ACTION_REPLACE With this third payload one can do: -bash-4.1# xen-xsplice load xen_hello_world.xsplice Uploading xen_hello_world.xsplice (10148 bytes) Performing check: completed Performing apply:. completed [xen_hello_world depends on hypervisor build-id] -bash-4.1# xen-xsplice load xen_bye_world.xsplice Uploading xen_bye_world.xsplice (7076 bytes) Performing check: completed Performing apply:. completed [xen_bye_world depends on xen_hello_world build-id] -bash-4.1# xen-xsplice upload xen_replace_world xen_replace_world.xsplice Uploading xen_replace_world.xsplice (7148 bytes) -bash-4.1# xen-xsplice list ID | status ----------------------------------------+------------ xen_hello_world | APPLIED xen_bye_world | APPLIED xen_replace_world | CHECKED -bash-4.1# xen-xsplice replace xen_replace_world Performing replace:. completed -bash-4.1# xl info | grep extra xen_extra : Hello Again World! -bash-4.1# xen-xsplice list ID | status ----------------------------------------+------------ xen_hello_world | CHECKED xen_bye_world | CHECKED xen_replace_world | APPLIED and revert both of the previous payloads and apply the xen_replace_world. All the magic of this is in the Makefile - we extract the build-id from the hypervisor (xen-syms) and jam it in the xen_replace_world as .xsplice.depends. We also make .old_addr be zero, forcing the hypervisor to lookup the xen_extra_version. Signed-off-by: Konrad Rzeszutek Wilk Acked-by: Jan Beulich Release-acked-by: Wei Liu --- diff --git a/.gitignore b/.gitignore index 88cec1d10c..1b7329313c 100644 --- a/.gitignore +++ b/.gitignore @@ -249,6 +249,7 @@ xen/arch/x86/efi/mkreloc xen/arch/x86/test/config.h xen/arch/x86/test/xen_hello_world.xsplice xen/arch/x86/test/xen_bye_world.xsplice +xen/arch/x86/test/xen_replace_world.xsplice xen/arch/*/efi/boot.c xen/arch/*/efi/compat.c xen/arch/*/efi/efi.h diff --git a/xen/arch/x86/test/Makefile b/xen/arch/x86/test/Makefile index 3a25ca39a7..a9d43a1765 100644 --- a/xen/arch/x86/test/Makefile +++ b/xen/arch/x86/test/Makefile @@ -7,15 +7,18 @@ CODE_SZ=$(shell nm --defined -S $(1) | grep $(2) | awk '{ print "0x"$$2}') XSPLICE := xen_hello_world.xsplice XSPLICE_BYE := xen_bye_world.xsplice +XSPLICE_REPLACE := xen_replace_world.xsplice default: xsplice install: xsplice $(INSTALL_DATA) $(XSPLICE) $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE) $(INSTALL_DATA) $(XSPLICE_BYE) $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_BYE) + $(INSTALL_DATA) $(XSPLICE_REPLACE) $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_REPLACE) uninstall: rm -f $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE) rm -f $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_BYE) + rm -f $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_REPLACE) .PHONY: clean clean:: @@ -72,5 +75,11 @@ xen_bye_world.o: config.h $(XSPLICE_BYE): xen_bye_world_func.o xen_bye_world.o hello_world_note.o $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(XSPLICE_BYE) $^ +xen_replace_world.o: config.h + +.PHONY: $(XSPLICE_REPLACE) +$(XSPLICE_REPLACE): xen_replace_world_func.o xen_replace_world.o note.o + $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(XSPLICE_REPLACE) $^ + .PHONY: xsplice -xsplice: $(XSPLICE) $(XSPLICE_BYE) +xsplice: $(XSPLICE) $(XSPLICE_BYE) $(XSPLICE_REPLACE) diff --git a/xen/arch/x86/test/xen_replace_world.c b/xen/arch/x86/test/xen_replace_world.c new file mode 100644 index 0000000000..fab284114f --- /dev/null +++ b/xen/arch/x86/test/xen_replace_world.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +#include "config.h" +#include +#include +#include + +#include + +static char xen_replace_world_name[] = "xen_extra_version"; +extern const char *xen_replace_world(void); + +struct xsplice_patch_func __section(".xsplice.funcs") xsplice_xen_replace_world = { + .version = XSPLICE_PAYLOAD_VERSION, + .name = xen_replace_world_name, + .old_addr = 0, /* Forces the hypervisor to lookup .name */ + .new_addr = xen_replace_world, + .new_size = NEW_CODE_SZ, + .old_size = OLD_CODE_SZ, +}; + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/x86/test/xen_replace_world_func.c b/xen/arch/x86/test/xen_replace_world_func.c new file mode 100644 index 0000000000..afb5cda3e3 --- /dev/null +++ b/xen/arch/x86/test/xen_replace_world_func.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +#include + +/* Our replacement function for xen_hello_world. */ +const char *xen_replace_world(void) +{ + return "Hello Again World!"; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */